# -*- coding: utf-8 -*-
"""
报告生成器
负责生成详细的重复检测分析报告
"""
from typing import Dict, List, Any
from datetime import datetime
from .models import VideoInfo, VideoType
from .video_group import VideoGroup, VideoVariant


class ReportGenerator:
    """报告生成器"""
    
    def generate_database_check_report(self, result: Dict[str, Any], filename: str = "") -> str:
        """
        生成数据库对比检测报告 (V2 - 支持详细对比)
        """
        report_lines = []
        
        # 报告头部
        report_lines.append("=" * 80)
        report_lines.append("数据库重复检测报告")
        report_lines.append("=" * 80)
        report_lines.append(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        if filename:
            report_lines.append(f"源文件: {filename}")
        report_lines.append("")
        
        # 总体统计
        report_lines.append("📊 总体统计")
        report_lines.append("-" * 40)
        report_lines.append(f"总文件数: {result['total_files']}")
        report_lines.append(f"有效文件数: {result['clean_files']}")
        report_lines.append(f"脏数据文件数: {result['dirty_files']}")
        report_lines.append(f"发现重复番号: {len(result['comparison_results'])} 个")
        report_lines.append(f"发现新番号: {len(result['new_videos'])} 个")
        
        if result['insert_enabled']:
            report_lines.append(f"✅ 数据库插入已启用")
            report_lines.append(f"成功插入新番号: {result['insert_success']} 个")
            if result['insert_failed'] > 0:
                report_lines.append(f"插入失败: {result['insert_failed']} 个")
        else:
            report_lines.append("❌ 数据库插入已禁用")
        report_lines.append("")

        # 重复对比详情
        if result['comparison_results']:
            report_lines.append("🔍 重复对比详情")
            report_lines.append("-" * 40)
            for i, comp in enumerate(result['comparison_results'], 1):
                report_lines.append(f"对比 {i}: {comp['core_id']}")
                
                local_attrs = self._get_video_attributes(comp['local_video'])
                db_attrs = self._get_video_attributes(comp['db_video'])
                
                report_lines.append(f"  -> 本地版本: {', '.join(local_attrs)}")
                report_lines.append(f"  -> 数据库版本: {', '.join(db_attrs)}")
                report_lines.append("-" * 40)
            report_lines.append("")

        # 新番号详情
        if result['new_videos']:
            report_lines.append("🆕 新番号详情 (前20个)")
            report_lines.append("-" * 40)
            for i, video in enumerate(result['new_videos'][:20], 1):
                attrs = self._get_video_attributes(video)
                report_lines.append(f"{i}. {video.core_id} - [{', '.join(attrs)}]")
            if len(result['new_videos']) > 20:
                report_lines.append(f"... 还有 {len(result['new_videos']) - 20} 个新番号")
            report_lines.append("")

        # 脏数据详情
        if result['dirty_data']:
            report_lines.append("⚠️  脏数据详情")
            report_lines.append("-" * 40)
            for i, dirty_video in enumerate(result['dirty_data'], 1):
                report_lines.append(f"{i}. {dirty_video.original_filename} -> {dirty_video.error_reason}")
            report_lines.append("")
        
        report_lines.append("=" * 80)
        return "\n".join(report_lines)

    def _get_video_attributes(self, video: VideoInfo) -> List[str]:
        """获取并格式化“虚拟视频”的属性列表"""
        attrs = []
        if video.has_4k:
            attrs.append("4K")
        if video.has_subtitle:
            attrs.append("字幕")
        if video.has_leak:
            attrs.append("流出")
        
        if video.segment_count > 1:
            attrs.append(f"{video.segment_count}个分段")
        elif not attrs:
            attrs.append("基础版")
            
        return attrs

    def generate_single_file_report(self, result: Dict[str, Any], filename: str = "") -> str:
        """
        生成单文件重复检测报告
        """
        report_lines = []
        
        report_lines.append("=" * 80)
        report_lines.append("视频文件重复检测报告")
        report_lines.append("=" * 80)
        report_lines.append(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        if filename:
            report_lines.append(f"源文件: {filename}")
        report_lines.append("")
        
        stats = result['stats']
        report_lines.append("📊 总体统计")
        report_lines.append("-" * 40)
        report_lines.append(f"总文件数: {result['total_files']}")
        report_lines.append(f"有效文件数: {result['clean_files']}")
        report_lines.append(f"脏数据文件数: {result['dirty_files']}")
        report_lines.append(f"唯一文件数: {stats['unique_files']}")
        report_lines.append(f"重复文件数: {stats['duplicate_files']}")
        report_lines.append(f"重复组数: {stats['duplicate_groups']}")
        report_lines.append("")
        
        if result['duplicates']:
            report_lines.append("🔍 重复文件详情")
            report_lines.append("-" * 40)
            for i, (base_id, video_group) in enumerate(result['duplicates'].items(), 1):
                report_lines.append(f"重复组 {i}: {base_id}")
                report_lines.append(f"  发现 {video_group.variant_count} 种版本类型，共 {video_group.total_files} 个文件")
                
                sorted_variants = self._sort_variants_by_priority(video_group.variants)
                
                for variant_type, variant_group in sorted_variants:
                    report_lines.append(f"    {variant_type.value}: {variant_group.file_count} 个文件")
                    for j, video in enumerate(variant_group.files, 1):
                        report_lines.append(f"        {j}. {video.original_filename}")
                report_lines.append("")
        
        if result['dirty_data']:
            report_lines.append("⚠️  脏数据详情")
            report_lines.append("-" * 40)
            for i, dirty_video in enumerate(result['dirty_data'], 1):
                report_lines.append(f"{i}. {dirty_video.original_filename} -> {dirty_video.error_reason}")
            report_lines.append("")

        report_lines.append("=" * 80)
        return "\n".join(report_lines)

    def _sort_variants_by_priority(self, variants: Dict[VideoVariant, 'VideoVariantGroup']) -> List[tuple]:
        """按优先级对版本类型进行排序"""
        priority_order = {
            VideoVariant.BASE: 1,
            VideoVariant.SUBTITLE: 2,
            VideoVariant.LEAK: 3,
            VideoVariant.FOUR_K: 4,
            VideoVariant.SEGMENT: 5,
            VideoVariant.SUBTITLE_SEGMENT: 6,
            VideoVariant.LEAK_SEGMENT: 7,
        }
        return sorted(variants.items(), key=lambda x: priority_order.get(x[0], 999))